package cc.loac.heba.service;

import cc.loac.heba.dao.CheckCodeDao;
import cc.loac.heba.pojo.CheckCode;
import cc.loac.heba.pojo.Result;
import cc.loac.heba.tool.Common;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Service
public class CheckCodeService {

    @Resource
    CheckCodeDao checkCodeDao;


    /**
     * 用于服务器内部对验证码进行判断
     * @param code 验证码
     * @param email 邮箱
     * @param type 验证码类型
     * @return Result
     */
    public Result checkCode(String email, String code, int type) {
        Result result = new Result();
        Date date = new Date();
        try {
            CheckCode checkCode = checkCodeDao.selectCheckCodeByCodeAndEmailAndType(code, email, type);
            // 验证码不存在
            if (checkCode == null) {
                result.setMessage("验证码错误，请重试");
                result.setStatus(-2);
                return result;
            }

            // 验证码过期
            if (date.getTime() >= checkCode.getExpirationTime().getTime()) {
                result.setMessage("验证码已经过期，请重新获取验证码");
                result.setStatus(-2);
                // 删除已经过期的验证码
                removeCheckCodeById(checkCode.getCodeId());
                return result;
            }

            // 验证码验证正确，删除验证码
            removeCheckCodeById(checkCode.getCodeId());
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return Common.exceptionResult();
        }
    }


    /**
     * 获取所有验证码
     * @return 验证码数组
     */
    public List<CheckCode> getAllCheckCode() {
        List<CheckCode> list;
        try {
            list = checkCodeDao.selectAllCheckCode();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据验证码 id 来删除验证码
     * @param codeId 验证码
     */
    public void removeCheckCodeById(int codeId) {
        try {
            checkCodeDao.deleteCheckCodeById(codeId);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据验证码 id 数组来删除验证码
     * @param ids 验证码数组
     * @return 改动条数
     */
    public int removeCheckCodeByIds(List<Integer> ids) {
        int result;
        try {
            result = checkCodeDao.deleteCheckCodeByIds(ids);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

    /**
     * 根据 email 来删除所有验证码
     * @param email 邮箱
     */
    public void removeCheckCodeByEmail(String email) {
        try {
            checkCodeDao.deleteCheckCodeByEmail(email);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 发送验证码
     * @param email 邮箱
     * @param type 验证码类型
     * @return Result
     */
    public String sendCode(String email, String type) {
        Result result = new Result();
        // 验证码类型
        int typeNum;
        try {
            // 判断验证码类型
            if (type.equals("register")) {
                // 注册类型验证码
                typeNum = CheckCode.TYPE_REGISTER;
            } else if (type.equals("forget")) {
                // 忘记密码类型验证码
                typeNum = CheckCode.TYPE_FORGET_PASSWORD;
            } else {
                // 未知类型，发送失败
                result.setMessage("未知类型，发送失败");
                result.setStatus(-2);
                return Common.toJson(result);
            }

            // 生成 5 位随机字符串验证码
            String code = Common.getRandomString(5);
            // 邮件内容
            String content = "你好，欢迎使用嘿板，你的验证码为：" + code + "。</br>验证码 10 分钟内有效。";

            // 调用邮件发送接口
            Connection connect = Jsoup.connect("https://sp-msg.luodachui.cn/email/sendLuodachuiEmail");
            connect.data("from", "admin@loac.cc");
            connect.data("password", "Zhouzhuang2001!");
            connect.data("toAddress", email);
            connect.data("subject", "嘿板验证码");
            connect.data("content", content);
            Document doc = connect.post();

            // 发送邮件
            if (doc.text().equals("成功")) {
                // 验证码发送成功
                // 先删除该邮箱之前的所有验证码
                removeCheckCodeByEmail(email);
                // 将验证码添加到数据库
                addCode(email, code, typeNum);
            } else {
                // 验证码发送失败
                result.setMessage("验证码发送失败，请稍后重试");
                result.setStatus(-2);
            }
            return Common.toJson(result);
        } catch (Exception e) {
            e.printStackTrace();
            return Common.exceptionResults();
        }
    }

    /**
     * 添加验证码，有效期 10 分钟
     * @param code 验证码
     * @param email 邮箱
     * @param type 验证码类型
     */
    public void addCode(String email, String code, int type) {
        try {
            // 有效期 10 分钟
            Date expirationTime = new Date(new Date().getTime() + 600000);
            checkCodeDao.insertCode(email, code, type, expirationTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
